package com.librelato.tela;

import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import com.librelato.bean.ProgramacaoProducaoBean;
import com.librelato.bean.UsuarioBean;
import com.librelato.negocio.ProgramacaoProdutoServico;
import com.librelato.negocio.interfaces.IServicoGenerico;
import com.librelato.util.Ferramentas;

@ManagedBean
@RequestScoped
public class ProgramacaoProducaoTela extends TelaAbstrata {

	private String htmlProgramacao;

	@ManagedProperty(value = "#{usuario}")
	private UsuarioBean usuario;

	private Map<String, String> param;

	private List<ProgramacaoProducaoBean> listaProgramas;

	private String dataDeFiltro;

	private String dataAteFiltro;

	private String setorDeFiltro;

	private String setorAteFiltro;

	private String filialFiltro;

	private String linhaFiltro;

	private String tipoPrgFiltro;

	private ProgramacaoProdutoServico<ProgramacaoProducaoBean> progServico;

	public ProgramacaoProducaoTela() {
		usuario = usuario == null ? (UsuarioBean) ((HttpSession) FacesContext
				.getCurrentInstance().getExternalContext().getSession(false))
				.getAttribute("usuario") : usuario;
		progServico = new ProgramacaoProdutoServico<ProgramacaoProducaoBean>();
		dataAteFiltro = Ferramentas.formataData(new Date().getTime(),
				"dd/MM/yy");
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(new Date());
		calendar.add(Calendar.DATE, -30);
		dataDeFiltro = Ferramentas.formataData(calendar.getTime().getTime(),
				"dd/MM/yy");
		tipoPrgFiltro = "PV";
	}

	public void filtraProgramacao() {
		param = new HashMap<String, String>();
		param.put("FILIAL", filialFiltro);
		param.put("TIPOPRG", tipoPrgFiltro);
		if (!"".equals(dataDeFiltro)) {
			param.put("DATADE", dataDeFiltro);
		}
		if (!"".equals(dataDeFiltro)) {
			param.put("DATAATE", dataAteFiltro);
		}
		if (!"".equals(setorDeFiltro)) {
			param.put("SETORDE", setorDeFiltro);
		}
		if (!"".equals(setorAteFiltro)) {
			param.put("SETORATE", setorAteFiltro);
		}
		if (linhaFiltro != null && !"".equals(linhaFiltro)) {
			param.put("LINHA", linhaFiltro);
		}
		try {
			listaProgramas = progServico.buscaProgramacaoProducao(param);

			StringBuilder sb = new StringBuilder();
			StringBuilder sbCabecalho = new StringBuilder();

			sb.append("<table id='j_idt43' class='ui-panelgrid ui-widget' style='margin: 0 auto;margin-top: 35px;' role='grid'>");

			sbCabecalho.append("<tr class='ui-widget-header' role='row'>");
			sbCabecalho
					.append("<td role='columnheader' class='ui-widget-header'>Pri</td>");
			sbCabecalho
					.append("<td role='columnheader' class='ui-widget-header'>Tipo</td>");
			sbCabecalho
					.append("<td role='columnheader' class='ui-widget-header'>Número</td>");
			sbCabecalho
					.append("<td role='columnheader' class='ui-widget-header'>Cliente</td>");
			sbCabecalho
					.append("<td role='columnheader' class='ui-widget-header'>RP</td>");
			sbCabecalho
					.append("<td role='columnheader' class='ui-widget-header'>Proj.</td>");
			sbCabecalho
					.append("<td role='columnheader' class='ui-widget-header'>Descrição</td>");
			sbCabecalho
					.append("<td role='columnheader' class='ui-widget-header'>Gru</td>");

			sbCabecalho
					.append("<td role='columnheader' class='ui-widget-header'>Dt Prog.</td>");
			sbCabecalho
					.append("<td role='columnheader' class='ui-widget-header'>Ag. Com.</td>");
			sbCabecalho
					.append("<td role='columnheader' class='ui-widget-header'>Posição</td>");
			sbCabecalho
					.append("<td role='columnheader' class='ui-widget-header'>Fil Ori</td>");
			sbCabecalho
					.append("<td role='columnheader' class='ui-widget-header'>Fil Prod</td>");
			sbCabecalho
					.append("<td role='columnheader' class='ui-widget-header'>OP</td>");
			sbCabecalho.append("</tr>");
			preecheHtmlTabela(sb, sbCabecalho);
			sb.append("</table>");

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void preecheHtmlTabela(StringBuilder sb, StringBuilder sbCabeca) {

		for (int i = 0; i < listaProgramas.size(); i++) {
			if (i == 0
					|| !listaProgramas.get(i).getSetor()
							.equals(listaProgramas.get(i - 1).getSetor())
					|| !listaProgramas.get(i).getDataEmissao()
							.equals(listaProgramas.get(i - 1).getDataEmissao())) {
				sb.append("<thead class='ui-panelgrid-header'>");
				sb.append("<tr class='ui-widget-header' style='text-align: left; font-size: 18px;' role='row'>");
				sb.append("<td role='columnheader' class='ui-widget-header' colspan='14'>");
				sb.append(listaProgramas.get(i).getSetor()
						+ " - "
						+ listaProgramas.get(i).getDescriSetor()
						+ " - "
						+ Ferramentas.formataData(listaProgramas.get(i)
								.getDataEmissao().getTime(), "dd/MM/yy"));
				sb.append("</td>");
				sb.append("</tr>");
				sb.append(sbCabeca.toString());
				sb.append("	</thead>");
			}
			sb.append("<tbody>");
			sb.append("<tr class='ui-widget-content' role='row'>");
			sb.append("<td role='gridcell'>");
			sb.append(listaProgramas.get(i).getPrioridade());
			sb.append("</td>");
			sb.append("<td role='gridcell'>");
			sb.append(listaProgramas.get(i).getTipoProducao());
			sb.append("</td>");
			sb.append("<td role='gridcell'>");
			sb.append(listaProgramas.get(i).getNumero());
			sb.append("</td>");
			if (listaProgramas.get(i).getProduto() != null
					&& listaProgramas.get(i).getProduto().getCodigo() != null) {
				sb.append("<td role='gridcell'>");
				sb.append(listaProgramas.get(i).getCliente().getNome());
				sb.append("</td>");
			} else {
				sb.append("<td role='gridcell'>");
				sb.append("--");
				sb.append("</td>");
			}
			if (listaProgramas.get(i).getPedidoVenda() != null
					&& listaProgramas.get(i).getPedidoVenda()
							.getRepresentante() != null) {
				sb.append("<td role='gridcell'>");
				sb.append(listaProgramas.get(i).getPedidoVenda()
						.getRepresentante().getNome());
				sb.append("</td>");
			} else {
				sb.append("<td role='gridcell'>");
				sb.append("--");
				sb.append("</td>");
			}

			if (listaProgramas.get(i).getProduto() != null) {
				sb.append("<td role='gridcell'>");
				sb.append(listaProgramas.get(i).getProduto().getCodigoProjeto());
				sb.append("</td>");
				sb.append("<td role='gridcell'>");
				sb.append(listaProgramas.get(i).getProduto().getDescricao());
				sb.append("</td>");
				sb.append("<td role='gridcell'>");
				sb.append(listaProgramas.get(i).getProduto().getGrupo());
				sb.append("</td>");

			} else {
				sb.append("<td role='gridcell'>");
				sb.append("</td>");
				sb.append("<td role='gridcell'>");
				sb.append("</td>");
				sb.append("<td role='gridcell'>");
				sb.append("</td>");
			}
			sb.append("<td role='gridcell'>");
			sb.append(Ferramentas.formataData(listaProgramas.get(i)
					.getDataEmissao().getTime(), "dd/MM/yy"));
			sb.append("</td>");
			sb.append("<td role='gridcell'>");
			if (listaProgramas.get(i).getDataAgendamento() != null) {
				sb.append(Ferramentas.formataData(listaProgramas.get(i)
						.getDataAgendamento().getTime(), "dd/MM/yy"));
			} else {
				sb.append("--");
			}
			sb.append("</td>");
			sb.append("<td role='gridcell'>");
			sb.append(listaProgramas.get(i).getEstagio());
			sb.append("</td>");
			sb.append("<td role='gridcell'>");
			sb.append(listaProgramas.get(i).getFilialOrigem());
			sb.append("</td>");
			sb.append("<td role='gridcell'>");
			sb.append(listaProgramas.get(i).getFilialProducao());
			sb.append("</td>");
			sb.append("<td role='gridcell'>");
			if (listaProgramas.get(i).getPedidoVenda().getOrdemProd()
					.getNumero() != null
					&& !"".equals(listaProgramas.get(i).getPedidoVenda()
							.getOrdemProd().getNumero().trim())) {
				sb.append(listaProgramas.get(i).getPedidoVenda().getOrdemProd()
						.getNumero()
						+ listaProgramas.get(i).getPedidoVenda().getOrdemProd()
								.getItem()
						+ listaProgramas.get(i).getPedidoVenda().getOrdemProd()
								.getSequencia());
			} else {
				sb.append("--");
			}
			sb.append("</td>");
			sb.append("</tr>");
			sb.append("</tbody>");
		}

		htmlProgramacao = sb.toString();

	}

	@Override
	protected IServicoGenerico<ProgramacaoProducaoBean> getServico() {
		return progServico;
	}

	public String getHtmlProgramacao() {
		return htmlProgramacao;
	}

	public void setHtmlProgramacao(String htmlProgramacao) {
		this.htmlProgramacao = htmlProgramacao;
	}

	public UsuarioBean getUsuario() {
		return usuario;
	}

	public void setUsuario(UsuarioBean usuario) {
		this.usuario = usuario;
	}

	public Map<String, String> getParam() {
		return param;
	}

	public void setParam(Map<String, String> param) {
		this.param = param;
	}

	public List<ProgramacaoProducaoBean> getListaProgramas() {
		return listaProgramas;
	}

	public void setListaProgramas(List<ProgramacaoProducaoBean> listaProgramas) {
		this.listaProgramas = listaProgramas;
	}

	public String getDataDeFiltro() {
		return dataDeFiltro;
	}

	public void setDataDeFiltro(String dataDeFiltro) {
		this.dataDeFiltro = dataDeFiltro;
	}

	public String getDataAteFiltro() {
		return dataAteFiltro;
	}

	public void setDataAteFiltro(String dataAteFiltro) {
		this.dataAteFiltro = dataAteFiltro;
	}

	public ProgramacaoProdutoServico<ProgramacaoProducaoBean> getProgServico() {
		return progServico;
	}

	public void setProgServico(
			ProgramacaoProdutoServico<ProgramacaoProducaoBean> progServico) {
		this.progServico = progServico;
	}

	public String getSetorDeFiltro() {
		return setorDeFiltro;
	}

	public void setSetorDeFiltro(String setorDeFiltro) {
		this.setorDeFiltro = setorDeFiltro;
	}

	public String getSetorAteFiltro() {
		return setorAteFiltro;
	}

	public void setSetorAteFiltro(String setorAteFiltro) {
		this.setorAteFiltro = setorAteFiltro;
	}

	public String getFilialFiltro() {
		return filialFiltro;
	}

	public void setFilialFiltro(String filialFiltro) {
		this.filialFiltro = filialFiltro;
	}

	public String getLinhaFiltro() {
		return linhaFiltro;
	}

	public void setLinhaFiltro(String linhaFiltro) {
		this.linhaFiltro = linhaFiltro;
	}

	public String getTipoPrgFiltro() {
		return tipoPrgFiltro;
	}

	public void setTipoPrgFiltro(String tipoPrgFiltro) {
		this.tipoPrgFiltro = tipoPrgFiltro;
	}

}
